package com.upbos.upm.dict;

import com.upbos.cache.SingleCacheManager;
import com.upbos.core.ret.RetCode;
import com.upbos.core.ret.RetData;
import com.upbos.core.util.StringPool;
import com.upbos.data.core.Pagination;
import com.upbos.upm.common.Constants;
import com.upbos.upm.common.UpmConfiguration;
import com.upbos.upm.entity.Dict;
import com.upbos.upm.entity.DictItem;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * <b>Application name：</b> DictService.java <br>
 * <b>Application describing: 配置数据字典服务</b> <br>
 * <b>Copyright：</b> Copyright &copy; 2015-2020 yideb.com 版权所有<br>
 * <b>Company：</b> yideb.com <br>
 * <b>Date：</b> 2019年05月11日 17:09 <br>
 * <b>author：</b> <a href="mailto:wjzchina2008@126.com"> Jason </a>
 * <b>version：</b>V5.0.0
 *
 * @author wangjz
 */
@Service
public class DictService {

    @Resource
    private DictDao dao;

    @Resource
    private SingleCacheManager singleCacheManager;

    @Resource
    private UpmConfiguration configuration;

    /**
     * 获取数据字典列表
     *
     * @param pageNo     页码
     * @param pageSize   每页条数
     * @param categoryId 分类Id
     * @param name       数据字典名称
     * @return 数据字典列表
     */
    public Pagination listDict(Integer pageNo, Integer pageSize, Long categoryId, String name) {
        return dao.listDict(pageNo, pageSize, categoryId, name);
    }

    /**
     * 获取数据字典项列表
     *
     * @param dictId 数据字典Id
     * @return 数据字典内容列表
     */
    public List<DictItem> listDictItem(Long dictId) {
        return dao.listDictItem(dictId);
    }

    /**
     * 保存数据字典
     *
     * @param dict 数据字典
     * @return 是否保存成功
     */
    @Transactional(rollbackFor = Exception.class)
    public RetData saveDict(Dict dict) {
        RetData retData = new RetData(RetCode.SUCCESS);
        if (dao.getDictCount(dict) > 0) {
            retData.setCode(RetCode.FAIL);
            retData.setMsg(String.format("数据字典标识【%s】已经存在", dict.getKey()));
            return retData;
        }
        if (dict.getId() == null) {
            dao.insertDict(dict);
        } else {
            dao.updateDict(dict);
            // 删除缓存
            singleCacheManager.getCache(configuration.getCacheName()).remove(Constants.CACHE_DICT_KEY_PREFIX + StringPool.COLON + dict.getKey());
        }
        return retData;
    }

    /**
     * 删除数据字典
     *
     * @param dict 数据字典
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteDict(Dict dict) {
        // 1. 删除数据字典项
        dao.deleteDictItem(dict);
        // 2. 删除数据字典
        dao.deleteDict(dict);
        // 3. 删除缓存
        singleCacheManager.getCache(configuration.getCacheName()).remove(Constants.CACHE_DICT_KEY_PREFIX + StringPool.COLON + dict.getKey());
    }

    @Transactional(rollbackFor = Exception.class)
    public void saveDictItem(List<DictItem> dictItems) {
        Dict dict = dao.getDict(dictItems.get(0).getDictId());
        // 先删除数据字典项
        dao.deleteDictItem(dict);
        // 再插入数据字典项
        dao.insertDictItem(dictItems);
        // 删除缓存
        singleCacheManager.getCache(configuration.getCacheName()).remove(Constants.CACHE_DICT_KEY_PREFIX + StringPool.COLON + dict.getKey());
    }


    public List<DictItem> listDictItemByDictKey(String dictKey) {
        // 数据字典缓存key
        String cacheKey = Constants.CACHE_DICT_KEY_PREFIX + StringPool.COLON + dictKey;

        // 先从缓存加载数据，如果未缓存，则从数据库获取，并存入缓存
        List<DictItem> itemList = (List<DictItem>) singleCacheManager.getCache(configuration.getCacheName()).get(cacheKey);
        if (itemList == null) {
            itemList = dao.listDictItemByDictKey(dictKey);
            singleCacheManager.getCache(configuration.getCacheName()).set(cacheKey, itemList);
        }

        return itemList;
    }
}
